package com.njtech.pet.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.njtech.pet.constant.Constant;
import com.njtech.pet.entity.Item;
import com.njtech.pet.entity.User;
import com.njtech.pet.service.ItemService;
import com.njtech.pet.service.MemberService;
import com.njtech.pet.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import javax.swing.plaf.nimbus.State;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * Member的controller
 * Author: cw
 * Date: 2020-04-7 17:43
 * Description:用来设置个人会员中心页面
 */
@Controller
@RequestMapping(value = "/member",produces="application/json;charset=UTF-8")
public class MemberController {

    @Autowired
    private MemberService memberService;

    @Autowired
    private UserService userService;

    @Autowired
    private ItemService itemService;


    /**
     * 进入个人特权介绍时调用
     * @param id 用户的ID
     * @return 返回一些基本的用户会员信息
     * 前端显示：userNme(用户名),memberLevel(VIP等级),endDate(会员到期时间),action(开通会员的控件类别),signIn(用户是否可以进行每日签到，为true或false)
     */
    @RequestMapping("/info")
    @ResponseBody
    public String showMemberInfo(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        if(user != null && user.getLevel() != 0) {
            Map<String,String> map = new HashMap<>();
            map.put("userName", "" + user.getUsername());
            map.put("memberLevel", memberService.showLevel(user));
            map.put("endDate", memberService.showExpireDate(user));
            map.put("action", "续费VIP");
            map.put("signIn",""+memberService.ifFirstSignInDaily(user));
            return JSON.toJSONString(map);
        }
        else{
            Map<String,String> map = new HashMap<>();
            map.put("userName", "" + user.getUsername());
            map.put("memberLevel", memberService.showLevel(user));
            map.put("endDate", " ");
            map.put("action", "开通VIP");
            map.put("signIn",""+memberService.ifFirstSignInDaily(user));
            return JSON.toJSONString(map);
        }
    }

    /**
     * 开通或续费VIP（点击开通(续费)VIPbutton时调用
     * @param id 用户的ID
     * @return 返回开通或续费VIP是否成功
     * 前端显示：通过alert显示开通结果，然后刷新用户内容显示开通后的结果（再次调用/info）
     */
    @RequestMapping("/topUp")
    @ResponseBody
    public String topUpMember(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        Map<String,Object> resultMap = new HashMap<>();
        if(memberService.getMember(user)){
            resultMap.put("result","开通成功!");
            return JSON.toJSONString(resultMap);
        }
        else {
            resultMap.put("result","开通失败!");
            return JSON.toJSONString(resultMap);
        }
    }

    /**
     * 用户每日签到功能（特权介绍中的每日签到button调用）
     * @param id 用户ID
     * @return 通过JSON返回签到结果，true为成功，false为失败
     * 前端显示：当action的value为true时，alert签到成功，签到button设置为不可选value为以前到，false也alert提示
     */
    @RequestMapping("/signIn")
    @ResponseBody
    public String dailySignIn(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        boolean flag = memberService.signIn(user);
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("action",flag);
        return JSON.toJSONString(resultMap);
    }

    /**
     * 跳转到会员模块时调用，判断用户是否是会员
     * @param id 用户的ID
     * @return action="是会员" 进入页面，action="不是会员" 返回提醒(alert方法)且不进入页面
     * 前端显示：通过判断action key的值来完成对应操作
     */
    @RequestMapping("/toPower")
    @ResponseBody
    public String toPower(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        Map<String,String> resultMap = new HashMap<>();
        if(user.getLevel() != 0){
            resultMap.put("action","是会员");
            return JSON.toJSONString(resultMap);
        }
        else {
            resultMap.put("action","不是会员");
            return JSON.toJSONString(resultMap);
        }
    }

    /**
     * 显示VIP的权限信息（使用在会员模块的信息显示）
     * @param id 当前用户ID
     * @return 返回对应参数所需要的JSON格式的数据
     * 前端显示：显示用户头像，等级名(VIP等级)，用户名，用户积分，积分上限，积分下限，折扣系数，积分系数
     */
    @RequestMapping("/power")
    @ResponseBody
    public String power(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        List<String> list = memberService.showLevelInfo(user);
        Map<String,String> map = new HashMap<>();
        map.put("等级名", list.get(0));
        map.put("用户名", "" + user.getUsername());
        map.put("用户积分",""+user.getCredit());
        map.put("下限", list.get(1));
        map.put("上限", list.get(2));
        map.put("折扣系数", list.get(3));
        map.put("积分系数", list.get(4));
        return JSON.toJSONString(map);
    }

    /**
     * 展示所有的有效优惠卷，用于用户领取优惠卷操作(使用在特权模块的优惠卷详情button)
     * @param id 用户信息
     * @return 返回优惠卷JSON，当用户不是VIP时返回null
     * 前端显示：通过form表单显示优惠卷的大体信息如：（itemName,subject,description,howLong(时长),price(省多少钱),credit(所需积分)），同行跟着领取button来进行领取操作
     */
    @RequestMapping("/coupon")
    @ResponseBody
    public String coupon(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        return JSON.toJSONString(memberService.showCoupon(user));
    }

    /**
     * 领取优惠卷操作（点击上个函数调用的同行领取button时调用）
     * @param id 用户ID
     * @param cId 优惠卷ID
     * @return 返回领取结果，并且刷新页面
     * 前端显示:根据返回结果，进行alert提醒，同时根据结果设置领取button的value为已领取(result为领取成功！)，result为领取失败！时只弹窗不修改button
     */
    @RequestMapping("/getCoupon")
    @ResponseBody
    public String getCoupon(@RequestParam("id") Integer id, @RequestParam("cId") Integer cId, HttpServletResponse response) throws IOException {
        User user = userService.selectByUserId(id);
        Item coupon = itemService.selectById(cId);
        boolean flag = memberService.getCoupon(user,coupon);
        Map<String,String> resultMap = new HashMap<>();
        if(flag){
            resultMap.put("result","领取成功!");
            return JSON.toJSONString(resultMap);
        }
        else {
            resultMap.put("result","领取失败!");
            return JSON.toJSONString(resultMap);
        }
    }

    /**
     * ---------准备完成-----------
     * 未完成，DIY保险界面
     * @param id 用户信息
     * @return 返回到DIY界面
     */
    @RequestMapping("/power/toDIYInsurance")
    public String toDIYInsurance(@RequestParam("id") Integer id){
        return "DIYInsurance";
    }

    /**
     * 展示用户的所有优惠卷信息（使用在会员模块优惠卷详情button）
     * @param id 用户信息
     * @return 返回优惠卷JSON，存放用户所拥有的优惠卷
     * 前端显示：通过form表单显示对应的优惠卷信息如：（itemName,subject,description,howLong(时长),price(省多少钱),credit(所需积分)）
     */
    @RequestMapping("/power/myCoupon")
    @ResponseBody
    public String myCoupon(@RequestParam("id") Integer id){
        User user = userService.selectByUserId(id);
        List<Item> list = memberService.showMyCoupon(user);
//        Map<String,Item> resultMap = new HashMap<>();
//        for(int i = 0;i < list.size();i++){
//            resultMap.put(i+"",list.get(i));
//        }
        return JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     * ---------准备完成-------
     * 未完成，专属客服页面
     * @return 返回到专属客服页面
     */
    @RequestMapping("/power/toPrivateService")
    public String toPrivateService(){
        return "privateService";
    }


    /**
     * --------需要和小罗合并------
     * 使用优惠券操作
     * @param id 用户id
     * @param cId 所用的优惠券id
     * @param itId 被使用的保险id
     * @return 返回是否时候成功
     */
    @RequestMapping("/coupon/useCoupon")
    @ResponseBody
    public String useCoupon(@RequestParam("id") Integer id, @RequestParam("cId") Integer cId, @RequestParam("itId") Integer itId){
        User user = userService.selectByUserId(id);
        Item coupon = itemService.selectById(cId);
        Item item = itemService.selectById(itId);
        Integer num = memberService.useCoupon(user,coupon,item);
        return JSON.toJSONString(num);
    }

    /**
     * 管理界面显示所有优惠卷
     * @return 返回list
     */
    @RequestMapping("/memberManagement/showAllCoupon")
    @ResponseBody
    public String showAllCoupon(){
        List<Item> list = memberService.showAllCoupon();
        return JSON.toJSONString(list);
    }

    /**
     * 管理界面添加优惠券
     * @param couponName 优惠券名字
     * @param description 描述
     * @param howLong 时效多长
     * @param price 优惠价格
     * @param credit 积分消耗
     * @param howUse 如何使用
     * @param remark 详情
     * @return 是否成功
     */
    @RequestMapping("/memberManagement/insertCoupon")
    @ResponseBody
    public String insertCoupon(@RequestParam("couponName") String couponName, @RequestParam("description") String description, @RequestParam("howLong") Integer howLong, @RequestParam("price") Double price, @RequestParam("credit") Integer credit, @RequestParam("howUse") String howUse, @RequestParam("remark") String remark){
        Item coupon = new Item();
        coupon.setItemName(couponName);
        coupon.setSubject("全场优惠券");
        coupon.setDescription(description);
        coupon.setHowLong(howLong);
        coupon.setHowUse(howUse);
        coupon.setRemark(remark);
        coupon.setPrice(price);
        coupon.setCredit(credit);
        coupon.setType(Constant.Item.TYPE_COUPON.getValue());
        coupon.setState(Constant.Item.STATE_VALID.getValue());
        coupon.setCreateDate(new Date());
        coupon.setPicUrl("");
        coupon.setWhenEffect("当场生效");
        coupon.setUpdateDate(new Date());
        boolean flag = memberService.insertCoupon(coupon);
        return JSON.toJSONString(flag);
    }

    /**
     * 管理界面修改优惠券
     * @param id 优惠券id
     * @param couponName 优惠券名字
     * @param description 描述
     * @param howLong 时效多长
     * @param price 优惠价格
     * @param credit 积分消耗
     * @param howUse 如何使用
     * @param remark 详情
     * @param state 状态 ：有效或者已下架
     * @return 是否成功
     */
    @RequestMapping("/memberManagement/updateCoupon")
    @ResponseBody
    public String updateCoupon(@RequestParam("id") Integer id, @RequestParam("couponName") String couponName, @RequestParam("description") String description, @RequestParam("howLong") Integer howLong, @RequestParam("price") Double price, @RequestParam("credit") Integer credit, @RequestParam("howUse") String howUse, @RequestParam("remark") String remark, @RequestParam("state") String state){
        Item coupon = itemService.selectById(id);
        coupon.setItemName(couponName);
        coupon.setDescription(description);
        coupon.setHowLong(howLong);
        coupon.setHowUse(howUse);
        coupon.setRemark(remark);
        coupon.setPrice(price);
        coupon.setCredit(credit);
        coupon.setState(state);
        coupon.setUpdateDate(new Date());
        boolean flag = memberService.updateCoupon(coupon);
        return JSON.toJSONString(flag);
    }

    /**
     * 修改优惠券前，通过id显示所需要修改的优惠券的一些信息
     * @param id
     * @return 返回优惠券信息
     */
    @RequestMapping("/memberManagement/update")
    @ResponseBody
    public String update(@RequestParam("id") Integer id){
        Item coupon = itemService.selectById(id);
        Map<String,String> map = new HashMap<>();
        map.put("couponName",coupon.getItemName());
        map.put("description",coupon.getDescription());
        map.put("howLong",coupon.getHowLong()+"");
        map.put("howUse",coupon.getHowUse());
        map.put("price",coupon.getPrice()+"");
        map.put("credit",coupon.getCredit()+"");
        map.put("state",coupon.getState());
        map.put("remark",coupon.getRemark());
        return JSON.toJSONString(map);
    }

}
